package com.store.bookstore_backend.web.interceptor;


import com.store.bookstore_backend.exception.BookStoreException;
import io.jsonwebtoken.Claims;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import static com.store.bookstore_backend.Util.JwtUtil.parseToken;

/**
 * 登录拦截器的编写
 */
@Component
@Slf4j
public class UserLoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 日志输出
        log.info("后台管理系统登陆校验拦截器拦截到请求,请求路径为 : {}", request.getRequestURL());
        // 检查是否是预请求，如果是直接放行
        String method = request.getMethod();
        if (method.equals("OPTIONS")) {
            return true;
        }
        // 登录校验需要什么逻辑呢？
        // 1、检查请求头中有没有token（令牌）
        String token = request.getHeader("token");
        if (token == null || token.isEmpty()) {
            // 抛出异常，说token不存在 约等于 用户未登录
            throw new BookStoreException(BookStoreException.CodeMsgEnum.USER_IS_NOT_LOGIN);
        }
        Long userId = null;
        // 2、检查token是否合法
        try {
            Claims claims = parseToken(token);
            userId = Long.parseLong(claims.getSubject());
        } catch (Exception e) {
            throw new BookStoreException(BookStoreException.CodeMsgEnum.USER_TOKEN_IS_INVALID);
        }

        System.out.println("userId:" + userId);

        // 3、如果token合法，解析出其中的用户id，保存在request中
        request.setAttribute("userId", userId);

        // 返回的结果代表是否放行
        return true;
    }
}
